#coding:utf8
from django.conf import settings
from urllib.parse import parse_qs,urlencode
from urllib.request import urlopen
import json

class QQOauth(object):



    def get_url(self):

        base_url = 'https://graph.qq.com/oauth2.0/authorize?'

        state = '/'
        # 组织参数
        params = {
            'response_type': 'code',
            'client_id': settings.QQ_APP_ID,
            'redirect_uri': settings.QQ_REDIRECT_URL,
            'state': state
            # 'scope':'get_user_info'
        }


        # 生成url
        # http://xxxxx?key=value&key=value
        # urllib.parse.urlencode(query)
        #
        # 将query字典转换为url路径中的查询字符串

        auth_url = base_url + urlencode(params)
        return auth_url

    def get_token(self,code):
        # 通过code 换 token
        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。

        base_url = 'https://graph.qq.com/oauth2.0/token?'

        params = {
            'grant_type': 'authorization_code',
            'client_id': settings.QQ_APP_ID,
            'client_secret': settings.QQ_APP_KEY,
            'code': code,
            'redirect_uri': settings.QQ_REDIRECT_URL
        }
        # 生成了 url
        token_url = base_url + urlencode(params)

        # 生成了url我们需要自己请求
        # urllib.parse.parse_qs(qs)
        # 将qs查询字符串格式数据转换为python的字典

        # urllib.request.urlopen(url, data=None)
        # 发送http请求，如果data为None，发送GET请求，如果data不为None，发送POST请求
        # 返回response响应对象，可以通过read()
        # 读取响应体数据，需要注意读取出的响应体数据为bytes类型

        response = urlopen(token_url)

        data = response.read().decode()

        # 'access_token=FCEF14FF0AAC0FC076CA3B1EAC033A4D
        # &expires_in=7776000&
        # refresh_token=DE7326DD8928473187140D94F3FF09EE'
        # print(data)

        # 我们把字符串转换为字典
        dict = parse_qs(data)

        # print(dict['access_token'])

        # <class 'list'>: ['A9E700787D44D10951294167F442B423']
        access_token = dict['access_token']

        token = access_token[0]

        return token


    def get_openid(self,token):
        # https://graph.qq.com/oauth2.0/me
        # GET
        # access_token        必须      在Step1中获取到的accesstoken。

        base_url = 'https://graph.qq.com/oauth2.0/me?'

        parms = {
            'access_token':token
        }

        openid_url = base_url + urlencode(parms)

        #  urlopen(openid_url) 来获取数据
        response = urlopen(openid_url)
        # 读取数据
        data = response.read().decode()

        print(data)
        # 'callback( {"client_id":"101474184","openid":"6646D699D1A36063C74AFA7A083EC5D1"} );'

        try:
            # 对数据进行截取 转换为 字典
            dict = json.loads(data[10:-4])
        except Exception:
            raise Exception('数据获取失败')

        # print(dict)
        openid = dict.get('openid')

        if openid is not None:
            # 返回openid
            return openid